package common;

public class Result <T>{
    // 返回码
    private Integer code;
    // 返回消息
    private String message;
    // 返回数据（泛型，可存放任意类型业务数据，用户信息 列表等
    private T data;
    //无参构造器，创建空对象
    public Result(){}
    // 静态方法：创建含数据的Result对象（基础  封装思想：创建实例并设置数据
    protected static <T> Result<T> build(T data) {
        Result<T> result = new Result<T>();//创建实例
        if (data != null)
            result.setData(data);//添加数据
        return result;
    }
    //静态方法：创建包含数据、状态码、消息的result对象，方法重载(临时新增业务状态，自定义状态码或信息
    public static <T> Result<T> build(T body, Integer code, String message) {
        Result<T> result = build(body);//构建基础result
        result.setCode(code);//设置状态码
        result.setMessage(message);//设置信息
        return result;
    }
    //静态方法：通过数据核ResultEnum枚举创建result对象
    public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
        Result<T> result = build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }
    /**
     * 操作成功
     * @param data  要返回的数据
     * @param <T> 数据类型
     * @return  封装好的成功响应result对象
     */
    public static<T> Result<T> ok(T data){
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.SUCCESS);//等价于 build(userList, ResultCodeEnum.SUCCESS)
    }
    //链式调用方法：设置消息并返回当前result对象
    public Result<T> message(String msg){
        this.setMessage(msg);//设置消息
        return this;
    }
    public Result<T> code(Integer code){
        this.setCode(code);
        return this;
    }
    //创建对象后修改message code 避免重复，灵活覆盖
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
}
